package com.vtuzx.kingdee.xqc_api.service;

import com.vtuzx.core.VtuzxException;
import com.vtuzx.core.bean.dto.VtuzxMap;
import com.vtuzx.core.bean.dto.VtuzxToken;
import com.vtuzx.web.bean.VtuzxDownloadBean;
import org.bson.types.ObjectId;

import java.util.List;
import java.util.Map;

/**
 * 其他出入库服务
 */
public interface IXqcStockTakeService {

    /**
     * 保存盘点方案
     * @param userId 用户id
     * @param name 用户姓名
     * @param param 入参
     * @return 返回结果
     */
    VtuzxMap saveStockTake(ObjectId userId, String name, Map<String, Object> param);

    /**
     * 审核单据
     * @param userId 用户id
     * @param name 用户名称
     * @param param 入参
     */
    void auditStockTake(ObjectId userId, String name, Map<String, Object> param);

    /**
     * 反审单据
     * @param userId 用户id
     * @param name 用户名称
     * @param param 入参
     */
    void unauditStockTake(ObjectId userId, String name, Map<String, Object> param);

    /**
     * 获取库存详细(恢复)
     * @param userId 用户id
     * @param billNo 单号
     * @return 返回结果
     * @throws VtuzxException
     */
    VtuzxMap getStockTakeDetail(ObjectId userId, String billNo) throws VtuzxException;

    /**
     * 删除盘点方案
     * @param userId 用户id
     * @param name 用户名称
     * @param param 入参
     */
    void deleteStockTake(ObjectId userId, String name, Map<String, Object> param);

    /**
     * 获取盘点列表
     * @param userId 用户id
     * @param name 用户名称
     * @param param 入参
     * @return 返回结果
     */
    VtuzxMap getStockTakeList(ObjectId userId, String name, Map<String, Object> param);

    /**
     * 下发到盘点作业
     * @param userId 用户id
     * @param name 用户名称
     * @param param 入参
     * @return 返回结果
     */
    void toStockTakeTask(ObjectId userId, String name, Map<String, Object> param) throws VtuzxException;

    /**
     * 审核单据
     * @param userId 用户id
     * @param name 用户名称
     * @param param 入参
     */
    void auditStockTakeTask(ObjectId userId, String name, Map<String, Object> param);

    /**
     * 反审单据
     * @param userId 用户id
     * @param name 用户名称
     * @param param 入参
     */
    void unauditStockTakeTask(ObjectId userId, String name, Map<String, Object> param) throws VtuzxException;

    /**
     * 查询盘点作业列表
     * @param userId
     * @param param
     * @return
     */
    VtuzxMap getStockTakeTaskList(ObjectId userId, Map<String, Object> param);

    /**
     * 查询盘点作业详细
     * @param userId
     * @param name
     * @param param
     * @return
     */
    VtuzxMap getStockTakeTaskDetail(ObjectId userId, String name, Map<String, Object> param);

    /**
     * 查询盘点作业详细箱子
     * @param userId
     * @param name
     * @param param
     * @return
     */
    VtuzxMap getStockTakeTaskDetailBox(ObjectId userId, String name, Map<String, Object> param);

    /**
     * 查询用户盘点作业
     * @param userId
     * @param name
     * @param param
     * @return
     */
    VtuzxMap getUserTask(ObjectId userId, String name, Map<String, Object> param);

    /**
     * 查询用户盘点作业详细
     * @param userId
     * @param name
     * @param billNo
     * @param stockNo
     * @return
     */
    Object getUserTaskDetail(ObjectId userId, String name, String billNo, String stockNo, String locationNo) throws VtuzxException;

    /**
     * 查询用户盘点作业详细详箱子
     * @param userId
     * @param name
     * @param billNo
     * @return
     */
    Object getUserTaskDetailBox(ObjectId userId, String name, String key, String billNo);

    /**
     * 扫码新增箱子
     * @param userId
     * @param name
     * @param boxNo
     * @param count
     * @param locationNo
     * @return
     */
    void addUserTaskDetailBox(ObjectId userId, String name, String boxNo, String locationNo, String billNo, double count) throws VtuzxException;

    /**
     * 扫批量码新增箱子
     * @param userId
     * @param name
     * @param boxList
     * @param locationNo
     * @return
     */
    void addUserTaskDetailBoxList(ObjectId userId, String name, List<Map<String, Object>> boxList, String locationNo, String billNo) throws VtuzxException;
    /**
     * 删除箱子
     * @param userId
     * @param name
     * @param boxNo
     */
    void deleteUserDetailBox(ObjectId userId, String name, String boxNo, String billNo);

    /**
     * 删除物料
     * @param userId
     * @param name
     * @param key
     */
    void deleteUserDetail(ObjectId userId, String name, String key, String billNo);

    /**
     * 完成盘点作业
     * @param userId
     * @param name
     * @param billNo
     */
    void saveUserTask(ObjectId userId, String name, String billNo, String stockNo, String locationNo);

    /**
     * 获取用户库存物料箱号
     *
     * @param stockNo 仓库编码
     * @param boxNo 箱号
     * @return 用户库存物料箱号
     */
    VtuzxMap getMaterialBox(String billNo, String stockNo, String locationNo, String boxNo) throws VtuzxException;

    /**
     * 根据RFID从即时库存单中获取物料批量入库
     * @param rfidList RFID列表
     * @return 采购收货的物料信息
     */
    Object getMaterialByRfidInStock(String billNo, List<String> rfidList, String stockNo, String locationNo);

    /**
     * 生成盘盈亏单
     * @param userId
     * @param name
     * @param billNo
     */
    void toTPALOrder(ObjectId userId, String name, String billNo) throws VtuzxException;

    /**
     * 审核单据
     * @param userId
     * @param name
     * @param param
     */
    void auditProfitAndLoss(ObjectId userId, String name, Map<String, Object> param) throws VtuzxException;

    /**
     * 反审单据
     * @param userId
     * @param name
     * @param param
     */
    void unauditProfitAndLoss(ObjectId userId, String name, Map<String, Object> param);


    /**
     * 查询盘盈亏列表
     * @param userId
     * @param param
     * @return
     */
    VtuzxMap getProfitAndLossList(ObjectId userId, Map<String, Object> param);

    /**
     * 查询盘盈亏详细
     * @param userId
     * @param name
     * @param param
     * @return
     */
    VtuzxMap getProfitAndLossDetail(ObjectId userId, String name, Map<String, Object> param);

    /**
     * 查询盘盈亏详细箱子
     * @param userId
     * @param name
     * @param param
     * @return
     */
    VtuzxMap getProfitAndLossDetailBox(ObjectId userId, String name, Map<String, Object> param);

    /**
     * 查询仓位列表
     * @param userId
     * @param name
     * @param stockNo
     * @return
     */
    VtuzxMap getLocationList(ObjectId userId, String name, String stockNo);

    /**
     * 查询有效rfid数量
     * @param userId
     * @param name
     * @param rfidList
     * @return
     */
    VtuzxMap getRfidCount(ObjectId userId, String name, List<String> rfidList, String billNo, String locationNo);

    /**
     * 查询有效boxNo数量
     * @param userId
     * @param name
     * @param boxNoList
     * @param billNo
     * @param locationNo
     * @return
     */
    Object getBoxNoCount(ObjectId userId, String name, List<String> boxNoList, String billNo, String locationNo);

    /**
     * 查询总箱数和已扫数
     * @param userId
     * @param name
     * @param param
     * @return
     */
    VtuzxMap getBoxCount(ObjectId userId, String name, Map<String, Object> param);

    Object downloadProfitAndLoss(ObjectId userId, String name, String id, String billNo) throws Exception;

    /**
     * 下载盘点作业详细
     * @param token
     * @param param
     * @return
     */
    VtuzxDownloadBean downloadStockTakeTaskDetail(VtuzxToken token, Map<String, Object> param) throws Exception;
}
